﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Follow.Common
{
    public class ValidationExceptions : Exception
    {
        #region attributes

        /// <summary>
        /// Lista com as exceções ocorridas.
        /// </summary>
        public List<ValidationExceptionItem> ExceptionItems
        {
            get
            {
                return this._exceptionItems;
            }
        }
        List<ValidationExceptionItem> _exceptionItems;

        #endregion

        #region constructors

        /// <summary>
        /// Construtor básico.
        /// </summary>
        public ValidationExceptions()
        {
            this._exceptionItems = new List<ValidationExceptionItem>();
        }

        /// <summary>
        /// Construtor.
        /// </summary>
        /// <remarks>
        ///     Este overload irá automaticamente disparar a exceção.
        /// </remarks>
        public ValidationExceptions(string exceptionType)
        {
            this._exceptionItems = new List<ValidationExceptionItem>();
            this.AddExceptionItem(exceptionType);
            this.ThrowPendingExceptions();
        }

        #endregion

        #region operations

        /// <summary>
        /// Adicionar exceção.
        /// </summary>
        /// <param name="exceptionType">Tipo da exceção.</param>
        public void AddExceptionItem(string exceptionType)
        {
            ValidationExceptionItem exceptionItem = new ValidationExceptionItem();
            exceptionItem.ExceptionType = exceptionType;
            this._exceptionItems.Add(exceptionItem);
        }

        /// <summary>
        /// Lançar as exceções caso estas existam.
        /// </summary>
        /// <exception cref="BusinessException">Se houver exceções na lista.</exception>
        public void ThrowPendingExceptions()
        {
            if (this._exceptionItems.Count > 0)
            {
                throw this;
            }
        }

        #endregion

    }

    /// <summary>
    /// Item Exceção.
    /// </summary>
    public class ValidationExceptionItem
    {
        /// <summary>
        /// Tipo da exceção.
        /// </summary>
        public string ExceptionType;
    }
}